package br.eng.eliseu.gwt.gestaoWeb.server.atualizacao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import br.eng.eliseu.gwt.gestaoWeb.model.nucleo.TabelaPadrao;
import br.eng.eliseu.gwt.gestaoWeb.server.util.XMLUtil;

import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.inject.persist.Transactional;

/* Classe que checa o arquivo XML com as configuracoes das Tabelas Padrao (TP) e 
 * checa com a tabela do banco 'TabelasPadrao'.
 */
@Singleton
public class VerificaTabelasPadrao {

	@Inject 
	EntityManager em;

	
	/* Retorno uma lista com os arquivos que deverao ser atualizados 
	 */
	public List<TabelaPadrao> getListaTabelasHaAtualizar(Connection connection, String path, String arquivoXML) throws Exception {
		
		List<TabelaPadrao> listaXML = carregaXML(path, arquivoXML);
		List<TabelaPadrao> listaDB  = carregaDB(connection);

		/* Todos os arquivos que estiverem na listaXML serao atualizados.
		 * Neste loop eu retiro da listaXML os arquivos que estiverem com 
		 * versao <= ao banco
		 */
		for (TabelaPadrao tpDB : listaDB) {
			for (TabelaPadrao tpXML : listaXML) {
				// --- Atualizo a versaoXML com a versaoDB
				if(tpDB.getNomeTabela().equals(tpXML.getNomeTabela())){
					if (tpDB.getVersao()==null || tpXML.getVersao()<=tpDB.getVersao()) {
						// --- Versao que esta no banco esta mais atual
						listaXML.remove(tpXML);
						break;
					}
				}
			}
		}
		return listaXML;
	}
	
	
	private List<TabelaPadrao> carregaXML(String path, String arquivoXML ) throws Exception {
		List<TabelaPadrao> listDoXML = new ArrayList<TabelaPadrao>();
		Document doc;
		try {
			doc = XMLUtil.getArquivoBin(path, arquivoXML );
			NodeList nodes = doc.getElementsByTagName("tabela"); 
			for (int i = 0; i < nodes.getLength(); i++) {
				Element element = (Element) nodes.item(i);
				TabelaPadrao tabela = new TabelaPadrao();
				tabela.setTabela(Integer.parseInt(element.getAttribute("tabela")));
				tabela.setCondicao(element.getAttribute("condicao"));
				tabela.setNomeArquivo(element.getAttribute("nomeArquivo"));
				tabela.setNomeTabela(element.getAttribute("nomeTabela"));
				tabela.setVersao(Integer.parseInt(element.getAttribute("versao")));
				tabela.setTotalRegistros(Integer.parseInt(element.getAttribute("totalRegistros")));

				listDoXML.add(tabela);
			}
		} catch (Exception e) {
			throw new Exception("Problema ao ler o arquivo XML "+arquivoXML);
		}
		return listDoXML;
	}

	@Transactional
	private List<TabelaPadrao> carregaDB(Connection connection)  {
		List<TabelaPadrao> lista = new ArrayList<TabelaPadrao>();
/*
		Query q;
		try {
			q = em.createNamedQuery("tabelaPadrao.all");
			lista = q.getResultList();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
*/
		
		try {
			PreparedStatement stmt;
			stmt = connection.prepareStatement("select * from TabelaPadrao ");
			ResultSet rs = stmt.executeQuery();
			while (rs.next()) {
				TabelaPadrao tp = new TabelaPadrao();
				tp.setId(rs.getInt("ID"));
				tp.setTabela(rs.getInt("TABELA"));
				tp.setNomeArquivo(rs.getString("NOMEARQUIVO"));
				tp.setNomeTabela(rs.getString("NOMETABELA"));
				tp.setTotalRegistros(rs.getInt("TOTALREGISTROS"));
				tp.setVersao(rs.getInt("VERSAO"));
				lista.add(tp);
			}
		} catch (SQLException e) {
			System.out.println(e.getMessage());
		}

		return lista;
	}
	
	
}